#include"SeqList.h"
#include <time.h>
//初始化
void SLInit(SL* s) {
    s->arr=NULL;
    s->capacity=s->size=0;
}

//销毁
void SLDestroy(SL* s) {
    free(s->arr);
    s->arr=NULL;
    s->capacity=s->size=0;
}

//检测空间不够
void SLFull(SL* s) {
    if(s->size==s->capacity) {
        int newCapacity=s->capacity==0?4:2*s->capacity;
        DataType* tmp=(DataType*)realloc(s->arr,2*newCapacity*sizeof(int));
        if(tmp==NULL) {
            exit(1);
        }
        s->arr=tmp;
        s->capacity=newCapacity;
    }
}

//尾插
void SLPushBack(SL* s,DataType x) {
    assert(s);
    SLFull(s);
    s->arr[s->size]=x;
    s->size++;
}

//尾删
void SLPopBack(SL* s) {
    assert(s);
    assert(s->size);//注意
    s->size--;
}

//头插
void SLPushFront(SL* s,DataType x) {
    assert(s);
    SLFull(s);
    for(int i=s->size-1;i>=0;i--) {
          s->arr[i+1]=s->arr[i];
    }
    s->arr[0]=x;
    s->size++;
}

//头删
void SLPopFront(SL* s) {
    assert(s);
    assert(s->size);
    for(int i=0;i<s->size;i++) {
        s->arr[i]=s->arr[i+1];
    }
    s->size--;
}

// //打印
// void SLPrint(SL* s) {
//     for(int i=0;i<s->size;i++) {
//         printf("%d ",s->arr[i]);
//     }
//     printf("\n");
// }

// //按值查找,返回下标
// int SLFind(SL* s, DataType x) {
//     assert(s);
//     for(int i=0;i<s->size;i++) {
//         if(s->arr[i]==x) {
//             return i;
//         }
//     }
//     return -1;
// }

//指定位置之前插入
void SLInsert(SL* s, int pos, DataType x) {
    assert(s);
    assert(pos>=0&&pos<=s->size);
    SLFull(s);
    if(pos==0) {
        SLPushFront(s,x);
        return;
    }
    for(int i=s->size-1;i>=pos;i--) {
        s->arr[i+1]=s->arr[i];
    }
    s->arr[pos]=x;
    s->size++;
}

//删除指定位置元素
void SLErase(SL* s, int pos) {
    assert(s);
    assert(pos>=0&&pos<=s->size-1);
    for(int i=pos+1;i<s->size;i++) {
        s->arr[i-1]=s->arr[i];
    }
    s->size--;
}